home *** CD-ROM | disk | FTP | other *** search
/ Skunkware 5 / Skunkware 5.iso / src / X11 / ashe-1.1 / xviewer.c < prev    next >
C/C++ Source or Header  |  1995-05-16  |  14KB  |  611 lines

  1. /** 
  2.  * 
  3.  * xviewer.c - (c) 1994 Copyright by John R. Punin
  4.  *
  5.  * ASHE
  6.  *
  7.  * This file has the routines to reload the HTML documents
  8.  *
  9.  * Create new frames of ASHE and Local Navigation
  10.  * 
  11.  * John R. Punin     Jul-24- 1994
  12.  *
  13. */
  14. #include "xhtml.h"       
  15. #include "xviewer.h"
  16. #include "xfile.h"
  17. /*#include "HTMLP.h"*/
  18.  
  19.  
  20. /* 
  21.    NAME : ViewerButtonCallBack
  22.    PARAMETERS : Not used
  23.    RETURN : void
  24.    DESCRIPTION : This Routine creates a new window to browse the
  25.                  html document
  26. */
  27. extern HTML_LIST *head_html;
  28. extern HTML_LIST *tail_html;
  29. extern MyAppResType myAppRes;
  30. Widget html_help;
  31.  
  32.  
  33. Widget 
  34. CreateHTMLwidget(Widget w,HTMLED *he)
  35. {
  36.    Widget html_text;
  37.    String tstring;
  38.  
  39.    int narg;
  40.    Arg  arglist[MAXARGS];
  41.    /*
  42.      *  Create HTML widget to browse Hypertext documents.
  43.      */
  44.  
  45.    narg = 0;
  46.    XtSetArg(arglist[narg],XmNwidth ,550 ); narg++;
  47.    XtSetArg(arglist[narg],XmNheight ,300 ); narg++;
  48.  
  49.    
  50.    html_text = XtVaCreateManagedWidget("texthtml",
  51.                        htmlWidgetClass,w,NULL);
  52.  
  53.    XtSetValues(html_text,arglist,narg);
  54.  
  55.    XtManageChild(html_text);
  56.  
  57.  
  58.    tstring = XmTextGetString(he->textarea);
  59.  
  60.    HTMLSetText(html_text,tstring,NULL,NULL,0,NULL,NULL);
  61.    XtFree(tstring);
  62.    return(html_text);
  63. }   
  64.  
  65.  
  66.  
  67. void
  68. Reload_HTML(
  69.     Widget  w,
  70.     XtPointer client_data, XtPointer call_data)
  71. {
  72.    HTMLED *he = (HTMLED *)client_data;
  73.    String tstring,title;
  74.    int vr,ssr, ir,pir;
  75.  
  76.    Widget verbar=XtNameToWidget(he->html_text,"Vbar");
  77.    if(verbar)
  78.    {
  79.       XmScrollBarGetValues(verbar,&vr,&ssr,&ir,&pir);
  80. /*      printf("Info is vr=%d,ssr=%d,ir=%d,pir=%d\n",vr,ssr,ir,pir);*/
  81.    }
  82.    
  83.    tstring = XmTextGetString(he->textarea);
  84.  
  85.    HTMLSetText(he->html_text,tstring,NULL,NULL,0,he->anchor_target,NULL);
  86.    if(verbar)
  87.       XmScrollBarSetValues(verbar,vr,ssr,ir,pir,True);
  88.  
  89.  
  90.    title = get_title(he->html_text);
  91.    if(title!=NULL)
  92.       Set_label(he->title_output,title);
  93.    else
  94.       Set_label(he->title_output,"");
  95.  
  96.    XmProcessTraversal(he->textarea,XmTRAVERSE_CURRENT);
  97.  
  98.    XtFree(tstring);   XtFree(title);
  99.  
  100. }
  101.  
  102. void 
  103. CreateNewFrame(Widget w,HTMLED *he)
  104. {
  105.    HTMLED *nhe;
  106.    Widget parent = he->textarea;
  107.    Widget shell_frame;
  108.    
  109.    shell_frame = XtVaCreatePopupShell("sframe",
  110.                                      topLevelShellWidgetClass, parent, NULL);
  111.  
  112.    nhe = create_rest_widgets(shell_frame,he);
  113.    Insert_html_frame(nhe);
  114. /*   Print_Frames();*/
  115.  
  116.    nhe->shell = shell_frame;
  117.  
  118.    XtPopup(shell_frame, XtGrabNone);
  119. }
  120. void
  121. CloseFrame(Widget w, HTMLED *he)
  122. {
  123.    Widget wshell = he->shell;
  124.    char buf[BUFSIZ];
  125.    int ask;
  126.    if(strcmp(XtName(wshell),"xhtml"))
  127.    {
  128.      if(he->modified_file)
  129.      {
  130.     char *fname = he->Name_File;
  131.     char *question=XtMalloc(strlen(fname)+50);
  132.     sprintf(question, 
  133.             "File %s has been modified. \n Do you want to save it?",fname);
  134.      if((ask = AskUser(he->textarea, question))==YES)
  135.      {
  136.         if(save_file_ok(he))
  137.         {
  138.            sprintf(buf,"This file %s can not be saved",fname);
  139.            printf("%s",buf);
  140.            Set_label(he->text_output,buf);
  141.            XtFree(question);
  142.            return;
  143.         }
  144.      }
  145.      else if(ask == CANCEL)
  146.      {
  147.         XtFree(question);
  148.         return;
  149.      }
  150.      XtFree(question);
  151.       }
  152.       Delete_html_frame(he);
  153. /*      Print_Frames();*/
  154.       XtFree((char *)he);
  155.       XtPopdown(wshell);
  156.    }
  157.    else
  158.       Set_label(he->text_output,"The main window xhtml can not be closed");
  159. }
  160.    
  161. void 
  162. anchor_call(Widget w, XtPointer client_data, XtPointer call_data)
  163. {
  164.    HTMLED *he = (HTMLED *)client_data;
  165.    WbAnchorCallbackData *ele_ref=(WbAnchorCallbackData *)call_data;
  166.    char *buf;
  167.    char *href=NULL,*name=NULL;
  168.    struct stat statbuf;        /* information on a file */
  169.    
  170. /*   printf("text is %s\n",ele_ref->text);
  171.    printf("href is %s\n",ele_ref->href);
  172.    printf ("id is %d \n",ele_ref->element_id);
  173.    printf("anchor is called\n");
  174. */
  175.    XtFree(he->href);
  176.    he->href=NULL;
  177.    strip_href(ele_ref->href,&href,&name);
  178. /*   printf("href is %s, name is %s\n",href,name);*/
  179.    if(name!=NULL)
  180.    {
  181.       XtFree(he->anchor_target);
  182.       he->anchor_target = XtMalloc(strlen(name)+1);
  183.       strcpy(he->anchor_target,name);
  184.       XtFree(name);
  185.    }
  186.  
  187.    if((href!=NULL)&&(href[0]!='\0'))
  188.    {
  189.       XtFree(he->href);
  190.       if(href[0]!='/')
  191.       {
  192.      he->href=getfile_href(href,he);
  193.      XtFree(href);
  194.       }
  195.       else
  196.      he->href = href;
  197.  
  198.       if(stat(he->href, &statbuf) == 0)
  199.       {
  200.      if(S_ISDIR(statbuf.st_mode))
  201.      {
  202.         buf = XtMalloc(strlen(he->href)+20);
  203.         sprintf(buf,"%s is a directory",he->href);
  204.         Set_label(he->text_output,buf);
  205.         XtFree(buf);
  206.         XtFree(he->href);
  207.         he->href = NULL;
  208.         return;
  209.      }
  210.       }
  211.       if(open(he->href,O_RDONLY,0)!=-1)
  212.      CreateNewFrame(w,he);
  213.       else
  214.       {
  215.      buf = XtMalloc(strlen(he->href)+20);
  216.      sprintf(buf,"Can't open to %s",he->href);
  217.      Set_label(he->text_output,buf);
  218.      XtFree(he->href);
  219.      he->href = NULL;
  220.      XtFree(buf);
  221.       }
  222.    }
  223.    else
  224.    {
  225.       if(he->anchor_target!=NULL)
  226.      Reload_HTML(w,(XtPointer)he,NULL);
  227.    }
  228. }
  229.  
  230. void 
  231. strip_href(char *ohref,char **href, char**name)
  232. {
  233.    int len=0;
  234.    int i;
  235.    *href = NULL;
  236.    *name = NULL;
  237.    if(ohref!=NULL)
  238.       len = strlen(ohref);
  239.  
  240.    if(len!=0)
  241.    {
  242.       *href = XtMalloc(len);
  243.       *name = XtMalloc(len);
  244.       (*name)[0]='\0';
  245.       for(i=len-1;i>=0;i--)
  246.      if(ohref[i]=='#')
  247.         break;
  248.       strcpy(*href,ohref);
  249.       if((i>=0)||((i==0)&&((*href)[0]=='#')))
  250.       {
  251.      (*href)[i]='\0';
  252.      strcpy(*name,&(ohref[i+1]));
  253.       }
  254.    }
  255. }      
  256.      
  257. char *
  258. getfile_href(char *nhref,HTMLED *he)
  259. {
  260.    char *fname = he->Name_File;
  261.    int len=strlen(fname);
  262.    char *path=NULL;
  263.    char *href = NULL;
  264.    int i,j;
  265.    if(len!=0)
  266.    {
  267.       for(i=len-1;i>=0;i--)
  268.      if(fname[i]=='/')
  269.         break;
  270.       if(i!=0)
  271.       {
  272.      path = XtMalloc(len+2);
  273.      for(j=0;j<=i;j++)
  274.         path[j]=fname[j];
  275.      path[j]='\0';
  276.      href=XtMalloc(i+strlen(nhref)+5);
  277.      strcpy(href,path);
  278.      strcat(href,nhref);
  279.       }
  280.    }   
  281.  
  282.    return(href);
  283. }
  284.  
  285. char *
  286. get_title(Widget whtml)
  287. {
  288.    String buffer=NULL;
  289.    char *title=NULL;
  290.  
  291. /*   HTMLWidget hw = (HTMLWidget) whtml;
  292.    char *wtitle = hw->html.title;
  293.    if(wtitle!=NULL)
  294.    {
  295.       title = XtMalloc(strlen(wtitle));
  296.       strcpy(title,wtitle);
  297.    }
  298. */
  299.  
  300.    XtVaGetValues(whtml,WbNtitleText,&buffer,NULL);
  301.  
  302.    if(buffer != NULL)
  303.    {
  304.       title = XtMalloc(strlen(buffer)+2);
  305.       strcpy(title,buffer);
  306.    }
  307.    /*XtFree(buffer);*/
  308.  
  309.    return(title);
  310. }
  311.  
  312. void
  313. Insert_html_frame(HTMLED *he)
  314. {
  315.    HTML_LIST *htemp = (HTML_LIST *)XtMalloc(sizeof(HTML_LIST));
  316.    htemp->fr = he;
  317.    htemp->next = head_html->next;
  318.    head_html->next = htemp;
  319. }
  320.    
  321. void 
  322. Delete_html_frame(HTMLED *he)
  323. {
  324.    HTML_LIST *htemp,*hfound;
  325.  
  326.    for(htemp = head_html;htemp->next != NULL; htemp = htemp->next)
  327.       if(htemp->next->fr == he)
  328.      break;
  329.  
  330.    if(htemp->next)
  331.    {
  332.       hfound = htemp->next;
  333.       htemp->next = hfound->next;
  334.       XtFree((XtPointer)hfound);
  335.    }
  336.    else
  337.       printf("Something is wrong. Your frame was not deleted from memory\n");
  338. }
  339.  
  340. void
  341. Print_Frames(void)
  342. {
  343.    HTML_LIST *htemp;
  344.    int i=0;
  345.  
  346.    printf("\n Frame List :\n");
  347.    for(htemp = head_html->next; htemp != tail_html; htemp = htemp->next)
  348.       printf("Fr %d :%s\n",i++,htemp->fr->Name_File);
  349. }
  350.  
  351. void
  352. Exit_ASHE(Widget w)
  353. {
  354.    save_unmodified_files(w);
  355.    exit_dialog(w);
  356. }
  357.  
  358. void
  359. exit_dialog(Widget w)
  360. {
  361.    Widget dialog;
  362.    XmString text,ok_str,cancel_str;
  363.    char *msg = "Do you really want to exit? \n";
  364.    dialog = XmCreateWarningDialog(w,"warning",NULL,0);
  365.    text = XmStringCreateLtoR(msg,XmFONTLIST_DEFAULT_TAG);
  366.    ok_str = XmStringCreateLocalized("Yes");
  367.    cancel_str = XmStringCreateLocalized("No");
  368.    XtVaSetValues(dialog,
  369.          XmNmessageString,text,
  370.          XmNokLabelString,ok_str,
  371.          XmNcancelLabelString,cancel_str,
  372.          NULL);
  373.  
  374.    /* Nor help neither text is available.... */
  375.    XtUnmanageChild(XmMessageBoxGetChild(dialog,XmDIALOG_HELP_BUTTON));
  376.    XtAddCallback(dialog,XmNokCallback,(XtCallbackProc)exit,NULL);
  377.  
  378.  
  379.  
  380.    XmStringFree(text);
  381.    XmStringFree(ok_str);
  382.    XmStringFree(cancel_str);
  383.    
  384.    XtManageChild(dialog);
  385.    XtPopup(XtParent(dialog),XtGrabNone);
  386. }
  387. void
  388. save_unmodified_files(Widget w)
  389. {
  390.    HTML_LIST *htemp;
  391.    HTMLED *he;
  392.    char *fname;
  393.    char buf[BUFSIZ];
  394.    int ask;
  395.    for(htemp = head_html->next; htemp != tail_html; htemp = htemp->next)
  396.    {
  397.       he=htemp->fr;
  398.       fname = he->Name_File;
  399.       if(he->modified_file)
  400.       {
  401.      char *question=XtMalloc(strlen(fname)+100);
  402.      sprintf(question, 
  403.             "File %s has been modified. \n Do you want to save it?",fname);
  404.      if((ask = AskUser(w, question))==YES)
  405.      {
  406.         if(save_file_ok(he))
  407.         {
  408.            sprintf(buf,"This file %s can not be saved",he->Name_File);
  409.            printf("%s",buf);
  410.            Set_label(he->text_output,buf);
  411.            XtFree(question);
  412.            return;
  413.         }
  414.      }
  415.      else if(ask == CANCEL)
  416.      {
  417.         XtFree(question);
  418.         return;
  419.      }
  420.      XtFree(question);
  421.       }
  422.    }
  423. }
  424.  
  425. void 
  426. Create_Shell_Help(Widget w, XtPointer client_data, XtPointer call_data)
  427. {
  428.    /*HTMLED *he = (HTMLED *)client_data;*/
  429.    HTMLED *he=NULL;
  430.    static Widget shell_help = NULL;
  431.    Widget parent = XtParent(w);
  432.    Widget workarea,dismiss,frame;
  433.    int item_no = (int)client_data;
  434.    char *anchor=NULL;
  435.    if(item_no == 0)
  436.    {
  437.       anchor = XtMalloc(8);
  438.       strcpy(anchor,"ASHE");
  439.    }
  440.    if(item_no == 1)
  441.    {
  442.       anchor = XtMalloc(15);
  443.       strcpy(anchor,"Key_Bindings");
  444.    }
  445.    if(item_no == 2)
  446.    {
  447.       anchor = XtMalloc(15);
  448.       strcpy(anchor,"charac_ref");
  449.    }
  450.  
  451.    XtVaGetValues(parent,XmNuserData,&he,NULL);
  452.  
  453.    if(!shell_help)
  454.    {
  455.       shell_help = XtVaCreatePopupShell("help_frame",
  456.                                      topLevelShellWidgetClass,he->textarea, NULL);
  457.       workarea = XmCreateForm(shell_help, "workhtml", NULL, 0);
  458.       frame = XtVaCreateManagedWidget("frame_html",xmFrameWidgetClass,workarea,
  459.                       XmNshadowType, XmSHADOW_ETCHED_IN, NULL);
  460.  
  461.       html_help = CreateHTMLwidget_help(frame,he,anchor);
  462.       dismiss = XmCreatePushButton(workarea,"dismiss",NULL,0);
  463.       XtAddCallback(dismiss,XmNactivateCallback,popdown_help,NULL);
  464.       XtAddCallback(html_help,WbNanchorCallback,anchor_help,he);
  465.       
  466.       XtVaSetValues(frame, XmNbottomAttachment, XmATTACH_FORM, 
  467.             XmNleftAttachment,XmATTACH_FORM,
  468.             XmNrightAttachment,XmATTACH_FORM,
  469.             XmNtopAttachment,XmATTACH_WIDGET, 
  470.             XmNtopWidget, dismiss, NULL);
  471.       XtVaSetValues(dismiss,XmNtopAttachment,XmATTACH_FORM,
  472.             NULL);
  473.       XtManageChild(frame);
  474.       XtManageChild(dismiss);
  475.       XtManageChild(workarea);
  476.    }
  477.    else
  478.       if(anchor)
  479.      HTMLGotoId(html_help,HTMLAnchorToId(html_help,anchor));
  480.    XtFree(anchor);
  481.    XtPopup(shell_help, XtGrabNone);
  482. }
  483.  
  484. void
  485. BuildHelpMenu(Widget menubar,HTMLED *he)
  486. {
  487.    XmString on_keys,on_index,on_charac,index_acc;
  488.  
  489.    on_index = XmStringCreateSimple("On Index...");
  490.    index_acc = XmStringCreateSimple("Ctrl-h");
  491.    on_keys = XmStringCreateSimple("On Keys...");
  492.    on_charac = XmStringCreateSimple("On Characters...");
  493.    XmVaCreateSimplePulldownMenu(menubar,"help_menu",6,Create_Shell_Help,
  494.            XmVaPUSHBUTTON, on_index, 'I',"Ctrl<Key>h",index_acc,
  495.            XmVaPUSHBUTTON, on_keys, 'K',"",NULL,
  496.            XmVaPUSHBUTTON, on_charac, 'C',"",NULL,
  497.            XmNuserData,he,
  498.            NULL);
  499.    XmStringFree(on_index);XmStringFree(on_keys);XmStringFree(index_acc);
  500.    XmStringFree(on_charac);
  501.    
  502. }
  503.    
  504. Widget 
  505. CreateHTMLwidget_help(Widget w,HTMLED *he,char* anchor)
  506. {
  507.    Widget html_text;
  508.    String tstring;
  509.  
  510.    int narg;
  511.    Arg  arglist[MAXARGS];
  512.  
  513.    /*
  514.      *  Create HTML widget to browse Hypertext documents.
  515.      */
  516.  
  517.    narg = 0;
  518.    XtSetArg(arglist[narg],XmNwidth ,550 ); narg++;
  519.    XtSetArg(arglist[narg],XmNheight ,300 ); narg++;
  520.  
  521.  
  522.    
  523.    html_text = XtVaCreateManagedWidget("texthtml",
  524.                        htmlWidgetClass,w,NULL);
  525.  
  526.    XtSetValues(html_text,arglist,narg);
  527.  
  528.    XtManageChild(html_text);
  529.  
  530.    tstring = read_help();
  531.  
  532.    HTMLSetText(html_text,tstring,NULL,NULL,0,anchor,NULL);
  533.  
  534.    XtFree(tstring); 
  535.    return(html_text);
  536. }   
  537.  
  538. String  
  539. read_help(void)
  540. {
  541.    int fd;
  542.    String name = "help.html";
  543.    String fname;
  544.    String mybuf;
  545.    struct stat statbuf;        /* information on a file */
  546.    int file_length=0;
  547.    int i=0;
  548.    long n;
  549.    mybuf = XtMalloc(90);
  550.    strcpy(mybuf,
  551.       "Error in help.html. \n Please, check in your resources file the htmldir resource");
  552. /*   printf("Resource directory is %s\n",myAppRes.htmldir); */
  553.    if(myAppRes.htmldir)
  554.    {
  555.       fname = XtMalloc(strlen(name)+strlen(myAppRes.htmldir)+2);
  556.       strcpy(fname,myAppRes.htmldir);
  557.       strcat(fname,"/");
  558.       strcat(fname,name);
  559.    }
  560.    else
  561.       fname = name;
  562.  
  563.    if(stat(fname, &statbuf) == 0)
  564.       file_length = statbuf.st_size;
  565.  
  566.    /* Opening and Reading the file */
  567.    if((fd = open(fname,O_RDONLY,0)) == -1)
  568.    {
  569.       fprintf(stderr,"File %s does not exist\n\n",name);
  570.       XtFree(fname);
  571.       return mybuf;
  572.     }
  573.    XtFree(mybuf);
  574.    mybuf = (char *)XtMalloc((unsigned)file_length+1);
  575.    while((n = read(fd, mybuf, file_length)) > 0)
  576.    {
  577.       if(n!=file_length)
  578.       fprintf(stderr,"Warning: did not read entire file!");
  579.       i++;
  580.       if (i==2) fprintf(stderr,"Reading the buffer again\n");
  581.     }
  582.  
  583.    XtFree(fname);
  584.    return(mybuf);
  585. }
  586.  
  587.  
  588. void
  589. popdown_help(Widget w, XtPointer client_data, XtPointer call_data)
  590. {
  591.    XtPopdown(XtParent(XtParent(w)));
  592. }
  593.  
  594. void
  595. anchor_help(Widget w, XtPointer client_data, XtPointer call_data)
  596. {
  597.    WbAnchorCallbackData *ele_ref=(WbAnchorCallbackData *)call_data;
  598.    
  599.  
  600.    char *href=NULL,*name=NULL;
  601.    strip_href(ele_ref->href,&href,&name);
  602.  
  603.    if(href[0]=='\0')
  604.    {
  605.       if((name!=NULL)&&(name[0]!='\0'))
  606.          HTMLGotoId(html_help,HTMLAnchorToId(html_help,name));
  607.    }
  608. }
  609.  
  610.  
  611.